package chapter02.part04;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 访问目录中的项
 * 
 * @author insight
 * @since 2021/8/21
 */
public class GetDirInfo {
    public static void main(String[] args) throws IOException {
        Path path = Paths.get("chapter02-io");

        // 读取目录中的项 惰性读取 可以高效读取有大量内容的目录
        // 不会递归处理所有子目录
        try (Stream<Path> list = Files.list(path)) {
            System.out.println("Files.list():");
            list.collect(Collectors.toList()).forEach(System.out::println);
            System.out.println();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        // 处理所有子目录和文件
        try (Stream<Path> list = Files.walk(path)) {
            System.out.println("Files.walk():");
            list.collect(Collectors.toList()).forEach(System.out::println);
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        // 过滤 walk 返回的路径 使用文件属性作为标准
        // 比 walk 高效
        try (Stream<Path> dir = Files.find(path, 4,
                (p, attr) -> attr.isDirectory())) {
            dir.collect(Collectors.toList()).forEach(System.out::println);
        }
        
        // 使用 walk 把一个目录递归复制到另一个目录 
        Path des = Paths.get("chapter02-io/src/main/resources/des");
        Path src = Paths.get("chapter02-io/src/main/resources/src");
        Files.walk(src).forEach(p -> {
            Path q = path.resolveSibling(des.resolve(src.relativize(p)));

            try {
                if (Files.isDirectory(p)) Files.createDirectory(q);
                else Files.copy(p, q);
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
        
        // walk 没办法删除目录树 因为删除此目录前 必须先删除子目录
        // 使用目录流即可
    }
}